package com.ys.duotai;

/**
 * 描述: 多态:
 * 前提: 继承 与 方法 重写
 *  父类引用 指向 子类
 *多态的总结:
 * 使用父类类型的引用指向子类的对象。
 * 该引用只能调用父类中定义的方法和变量。
 * 如果子类中重写了父类中的一个方法，在调用这个方法的时候，将会调用子类中的这个方法；（动态连接，动态调用）
 * 变量不能被重写（覆盖），”重写“的概念只针对方法，如果在子类中”重写“了父类中的变量，那么在编译时会报错。
 * 多态的必要条件：继承，重写，父类引用指向子类对象。
 * @author CodeYang
 * @version 2020/12/16 16:00
 */
public class Test01 {

    public static void main(String[] args) {
        Tom obj1 = getSuperClassInThis("");
        Tom obj2 = getSuperClassInThis("AtoTom");
        Tom obj3 = getSuperClassInThis("BtoTom");
        Tom obj4 = getSuperClassInThis("CtoTom");
        obj1.eat();
        obj2.eat();
        obj3.eat();
        obj4.eat();

    }
    /**
     * 简单工厂设计模式
     * :  父类引用指向子类
     */

    public static Tom getSuperClassInThis(String name){

        switch(name){
            case "":
                return new Tom();
            case "AtoTom":
                return new AtoTom();
            case "BtoTom":
                return new BtoTom();
            case "CtoTom":
                return new BtoTom();
            default:
                throw  new IllegalArgumentException("参数不合法");
        }

    }
}
